#include <stdint.h>
#include "stm32f4xx_hal.h"

#ifndef MPU9250_H
#define MPU9250_H
// 定义MPU9250内部地址
//****************************************
#define	SMPLRT_DIV		0x19	//陀螺仪采样率，典型值：0x07(125Hz)
#define	CONFIG			0x1A	//低通滤波频率，典型值：0x06(5Hz)
#define	GYRO_CONFIG		0x1B	//陀螺仪自检及测量范围，典型值：0x18(不自检，2000deg/s)
#define	ACCEL_CONFIG	0x1C	//加速计自检、测量范围及高通滤波频率，典型值：0x01(不自检，2G，5Hz)

#define	ACCEL_XOUT_H	0x3B
#define	ACCEL_XOUT_L	0x3C
#define	ACCEL_YOUT_H	0x3D
#define	ACCEL_YOUT_L	0x3E
#define	ACCEL_ZOUT_H	0x3F
#define	ACCEL_ZOUT_L	0x40

#define	TEMP_OUT_H		0x41
#define	TEMP_OUT_L		0x42

#define	GYRO_XOUT_H		0x43
#define	GYRO_XOUT_L		0x44
#define	GYRO_YOUT_H		0x45
#define	GYRO_YOUT_L		0x46
#define	GYRO_ZOUT_H		0x47
#define	GYRO_ZOUT_L		0x48

#define MPU9250_RA_INT_PIN_CFG 0x37
#define MAG_XOUT_L		0x03
#define MAG_XOUT_H		0x04
#define MAG_YOUT_L		0x05
#define MAG_YOUT_H		0x06
#define MAG_ZOUT_L		0x07
#define MAG_ZOUT_H		0x08


#define	PWR_MGMT_1		0x6B	//电源管理，典型值：0x00(正常启用)
#define	WHO_AM_I		  0x75	//IIC地址寄存器(默认数值0x68，只读)


//****************************

#define	GYRO_ADDRESS   0xD0	  //陀螺地址
#define MAG_ADDRESS    0x18   //磁场地址 0C <<1 = 0X18
#define ACCEL_ADDRESS  0xD0

#define M_PI 3.14159265358979323846
#define GYRO_SCALE 65.5f      // 2000角度 dps / 32768/2000=16.384 LSB/dps
#define ACCEL_SCALE 16384.0f   // 2g / 16384 lsb /g


class MPU9250
{
public:
	MPU9250(I2C_HandleTypeDef *_p_i2c);
	void read_accel(int16_t *p_data_acc);
	void read_gyro(int16_t *p_data);
	void read_mag(int16_t *p_data);
	bool single_write(uint8_t SlaveAddress,uint8_t REG_Address,uint8_t REG_data);
	uint8_t single_read(uint8_t SlaveAddress,uint8_t REG_Address);
	void Scan_I2C_Addresses();

private:
	I2C_HandleTypeDef *p_i2c;
	uint8_t TX_DATA[4];  	 //显示据缓存区
	uint8_t  BUF[10];       //接收数据缓存区
	int8_t  test=0; 				 //IIC用到
	int16_t T_X,T_Y,T_Z,T_T;		 //X,Y,Z轴，温度
	// 四元数
	float q0 = 1.0f, q1 = 0.0f, q2 = 0.0f, q3 = 0.0f;
	float beta = 0.1f;  // 互补滤波增益




};

#endif
